﻿using System;
using System.Collections.Generic;
using Monitor.Models.Json;
using System.Linq;
using Monitor.Repository.UserRepository.LinqModel;

namespace Monitor.Models.Interfaces
{

    #region IUserRepository

    public interface IUserRepository : IDisposable
    {
        /// <summary>
        /// Функция определяет доступен ли логин
        /// </summary>
        /// <param name="login">логин</param>
        /// <returns>истина, если доступен, ложь - занят</returns>
        bool FreeLogin(string login);

        /// <summary>
        /// Удаляет машину из БД пользователей
        /// </summary>
        /// <param name="carFK">индификатор машины из БД сервера</param>
        /// <returns>возвращает истина, если удаление произошло успешно</returns>
       
        bool CarConfigRemove(Int64 carFK);

        #region работа с по извлечение, добавлению, редактировани и удалению пользоватей
        
        /// <summary>
        /// Извлечение всего списка пользователей
        /// </summary>
        IEnumerable<User> Users { get; }
        
        /// <summary>
        /// Извлечение пользователя по его индификатору
        /// </summary>
        /// <param name="id">индификатор</param>
        /// <returns>Пользователь в системе</returns>
        User GetUser(int id);
        
        /// <summary>
        /// Извлечение пользователя по его логину
        /// </summary>
        /// <param name="name">логин</param>
        /// <returns>Пользователь в системе</returns>
        User GetUser(string name);
        
        /// <summary>
        /// добавление нового пользователя в систему
        /// </summary>
        /// <param name="model">модель нового пользователя</param>
        /// <returns>истина, если удаление успешно, ложь если модель неправильная или занят логин, в случае ошибки действия откатываются и передается ошибка</returns>
        bool AddNewUser(UserInputModel model);
        
        /// <summary>
        /// обновление пользователя
        /// </summary>
        /// <param name="model">модель пользователя</param>
        /// <returns>истина - если успешно, ложь - если модель неправильная или такого пользователя уже нет. Ошибка передается наверх</returns>
        bool UpdateUser(UserInputModel model);

        /// <summary>
        /// удаление пользователя по его логину
        /// </summary>
        /// <param name="login">логин</param>
        void DeleteUser(string login);

        #endregion

        #region редактирование дерева машинок пользователя

        /// <summary>
        /// Перемещает машинку из одной группы в другую
        /// </summary>
        /// <param name="userName">имя пользователя</param>
        /// <param name="carId">Индификатор машины</param>
        /// <param name="oldGroupId">старый каталог(по умолчанию вставляет в катало)</param>
        /// <param name="newGroupId">новый каталог</param>
        /// <returns>истина, если перемещение успешно прошло, ложь - неполные данные</returns>
        bool MoveCar(string userName, long carId, long newGroupId, long oldGroupId = -1);

        /// <summary>
        /// Добавить новую машину из конфигурации к пользователю в группу
        /// </summary>
        /// <param name="userName">логин пользователя</param>
        /// <param name="fk_Id">id машины в системе</param>
        /// <param name="groupId">индификатор группы</param>
        /// <returns>объект Машина из БД</returns>
        Car AddNewCar(string userName, long fk_Id, long groupId);

        /// <summary>
        /// Назначает группе пользователя нового радителя в иерархии
        /// </summary>
        /// <param name="userName">логин пользователя</param>
        /// <param name="groupId">индификатор группы</param>
        /// <param name="newParentId">индификатор назначаемого родителя</param>
        /// <returns>истина - операция успешно завершена, ложь - данные недостоверные</returns>
        bool MoveGroup(string userName, long groupId, long newParentId);


        /// <summary>
        /// Удаляет машину из дерева машин выбранного пользователя у выбранной группы
        /// </summary>
        /// <param name="userName">имя пользователя</param>
        /// <param name="carId">индификатор машины</param>
        /// <param name="groupId">индификатор группы</param>
        /// <returns>истина - удаление успешно прошло, ложь - не все данные</returns>
        bool DeleteCarFromGroup(string userName, long carId, long groupId);

        /// <summary>
        /// Удаляет машину у пользователя
        /// </summary>
        /// <param name="userName">логин пользователя</param>
        /// <param name="groupId">индификатор группы</param>
        /// <returns>истина - удаление успешно, ложь - не все данные</returns>
        bool DeleteGroup(string userName, long groupId);

        /// <summary>
        /// Добавление новой группы
        /// </summary>
        /// <param name="userName">имя пользователя</param>
        /// <param name="groupLabel">название группы</param>
        /// <param name="parentId">индификатор родителя</param>
        /// <returns>истина - добавить удалось, ложь - не все данные</returns>
        bool AddNewGroup(string userName, string groupLabel, long parentId);

        #endregion


        #region редактирование дерева зон
        /// <summary>
        /// Добавление новой группы зон
        /// </summary>
        /// <param name="userName">логин</param>
        /// <param name="label">имя зоны</param>
        /// <param name="parentId">индификатор родителя</param>
        /// <returns>истина - вставка осуществлена, ложь - неполные данные</returns>
        bool AddNewZoneGroup(string userName, string label, long parentId);

        /// <summary>
        /// Перемещение зоны из одной группы в другую
        /// </summary>
        /// <param name="userName">имя пользователя</param>
        /// <param name="zoneGroupId">индифиатор зоны</param>
        /// <param name="parentId">индификатор нового мастера зоны</param>
        /// <returns>истина - данные достоверные, ложь - неполные данные</returns>
        bool MoveZoneGroup(string userName, long zoneGroupId, long parentId);
        
        /// <summary>
        /// Удаление группы зон у пользователя
        /// </summary>
        /// <param name="userName">имя пользователя</param>
        /// <param name="id">индификатор группы зон</param>
        /// <returns>истина - удаление прошло, ложь - уже отсутствует</returns>
        bool RemoveZoneGroup(string userName, long id);



        /// <summary>
        /// Добавление новой зоны пользователю
        /// </summary>
        /// <param name="userName">логин пользователя</param>
        /// <param name="masterId">индификатор группы</param>
        /// <param name="model">модель зоны</param>
        /// <returns>истина - данные все, ложь - данные неполные</returns>
        bool AddNewZone(string userName, long masterId, NewZoneItem model);

        /// <summary>
        /// Перемещение зоны
        /// </summary>
        /// <param name="userName">имя пользователя</param>
        /// <param name="zoneId">индификатор зоны</param>
        /// <param name="newGroupeId">индификатор новой группы</param>
        /// <returns>истина - данные все, ложь - неполные данные</returns>
        bool MoveZone(string userName, long zoneId, long newGroupeId);

        /// <summary>
        /// Удаление группы зон у пользователя
        /// </summary>
        /// <param name="userName">имя пользователя</param>
        /// <param name="id">индификатор зоны</param>
        /// <returns>истина - удаление прошло, ложь - уже отсутствует</returns>
        bool RemoveZone(string userName, long id);

        #endregion

    }

    #endregion
}